<html>
<script>
    // 高阶函数
    // 所谓高阶函数就是操作函数的函数的函数
    // function not(f) {
    //     return function () {
    //         var result = f.apply(this.arguments);
    //         return !result;
    //     };
    // }

    // var even = function (x) {
    //     return x % 2 === 0;
    // }

    // var odd = not(even);
    // console.log(odd);
    // console.log([1, 2, 3, 5, 5].every(odd));

    // // 一个更为常见的例子
    // function compose(f, g) {
    //     return function () {
    //         return f.call(this, g.apply(this, arguments));
    //     };
    // }

    // 例子 接收两个函数f()g()，并返回一个新的函数函数用于计算f(g())

    // function compose(f, g) {
    //     return function () {
    //         console.log(arguments);
    //         return f.call(this, g.apply(this, arguments));
    //     };
    // }

    // var square = function (x) {
    //     return x * x
    // };

    // var sum = function (x, y) {
    //     return x + y
    // };
    // var squareofsum = compose(square, sum);
    // console.log(squareofsum);

    // console.log(squareofsum(2, 9));

    // 不完全函数
    function array(a, n) {
        console.log(a);
        // console.log(n || 0);
        console.log(Array.prototype.slice.call({ 0: function (x, y, z) { return x * (y - z) }, 1: 2, length: 2 }, n || 0));
        console.log(Array.prototype.slice.call(a,n || 0));
        // console.log(Array.prototype.slice(1, n | 0));
        return Array.prototype.slice.call(a, n || 0);
    };

    // 这个函数的实参传递
    function partialLeft(f /*, ...*/) {
        var args = arguments;
        console.log(args);
        return function () {
            var a = array(args, 1);
            console.log(arguments);
            a = a.concat((array(arguments)));
            console.log(a);
            return f.apply(this, a);
        };
    }

    // 这个函数的实参传递至右侧
    function partialRight(f /*,...*/) {
        var args = arguments;
        return function () {
            var a = array(args, 1);
            a = a.concat(array(arguments));
            return f.apply(this, a);
        };
    }

    function partial(f /*,,,,*/) {
        var args = arguments;    // 保存外部实参数组
        return function () {
            var a = array(args, 1);    // 从外部args开始
            console.log(a);
            var i = 0, j = 0;
            for (; i < a.length; i++) {
                if (a[i] === undefined) { a[i] = arguments[j++]; }
            }
            a = a.concat(array(arguments, j));
            return f.apply(this, a);
        }
    }

    var f = function (x, y, z) { return x * (y - z); };
    // 注意这三个不完全调用之间的区别
    // console.log(partialLeft(f, 2)(3, 4));
    console.log(partial(f, 2)(3, 4));

    var sum = function (x, y) {
        return x + y
    };

    var increment = partialLeft(sum, 1);
    var culleroot = partialRight(Math.pow, 1 / 3);
    String.prototype.first = partial(String.prototype.charAt, 0);
    String.prototype.last = partial(String.prototype.substr, -1, 1)





</script>


<head>
    <title>放置文章标题</title>
</head>

<body>

</body>

</html>